package com.sanbi.shield.common.repsonse;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;

/**
 * 通用应答
 *
 * @author XiaoQingqing
 * @since 2024/01/23
 * @param <T> 数据类型
 */
@Data
@Accessors(chain = true)
public class CommonResponse<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * 默认成功状态码
     */
    private static final Integer DEFAULT_SUCCESS_CODE = 200;
    /**
     * 默认成功信息
     */
    private static final String DEFAULT_SUCCESS_MESSAGE = "成功";
    /**
     * 默认失败状态码
     */
    private static final Integer DEFAULT_FAILURE_CODE = 500;
    /**
     * 默认失败信息
     */
    private static final String DEFAULT_FAILURE_MESSAGE = "失败";
    /**
     * 成功状态码
     */
    @Getter
    @Setter
    private static Integer successCode = DEFAULT_SUCCESS_CODE;
    /**
     * 成功信息
     */
    @Getter
    @Setter
    private static String successMessage = DEFAULT_SUCCESS_MESSAGE;
    /**
     * 失败状态码
     */
    @Getter
    @Setter
    private static Integer failureCode = DEFAULT_FAILURE_CODE;
    /**
     * 失败信息
     */
    @Getter
    @Setter
    private static String failureMessage = DEFAULT_FAILURE_MESSAGE;
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 子状态码
     */
    private Integer subCode = 0;
    /**
     * 信息
     */
    private String message;
    /**
     * 数据
     */
    private T data;

    /**
     * 成功应答
     *
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> ok(){
        return ok(null);
    }

    /**
     * 成功应答
     *
     * @param data 数据
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> ok(T data){
        return of(successCode, 0, successMessage, data);
    }

    /**
     * 失败应答
     *
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> fail(){
        return fail(failureMessage);
    }

    /**
     * 失败应答
     *
     * @param message 失败信息
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> fail(String message){
        return of(failureCode, 0, message);
    }

    /**
     * 构造方法
     *
     * @param code    状态码
     * @param subCode 子状态码
     * @param message 信息
     * @param data    数据
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> of(Integer code, Integer subCode, String message, T data){
        CommonResponse<T> response = new CommonResponse<>();
        return response.setCode(code).setSubCode(subCode).setMessage(message).setData(data);
    }

    /**
     * 构造方法
     *
     * @param code    状态码
     * @param subCode 子状态码
     * @param message 信息
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> of(Integer code, Integer subCode, String message){
        return of(code, subCode, message, null);
    }

    /**
     * 构造方法
     *
     * @param code    状态码
     * @param message 信息
     * @return 通用应答对象
     * @param <T> 数据类型
     */
    public static <T> CommonResponse<T> of(Integer code, String message){
        return of(code, 0, message);
    }

    /**
     * 是否请求成功
     *
     * @return 判断结果
     */
    public boolean isSuccess(){
        return Objects.equals(successCode, this.getCode());
    }

}
